package 多线程.CompletableFuture异步编排;

import lombok.Data;

import java.util.Date;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 thenCombine: 组合两个 future，取两个 future 的返回结果，并返回当前任务的返回值
 thenAcceptBoth: 组合两个 future，获取两个 future 任务的返回结果，然后处理任务，没有
 返回值。
 runAfterBoth: 组合两个 future，不需要获取 future 的结果，只需两个 future 处理完任务后
 处理该任务。
 */
public class ThreadTest08 {
    // 自定义线程池
    public static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务A开始执行...");
            System.out.println("任务A执行完毕...");
            return "A";
        }, executorService);

        CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务B开始执行...");
            System.out.println("任务B执行完毕...");
            return "B";
        }, executorService);

        CompletableFuture<String> futureC = futureA.thenCombine(futureB, (firstResult, secondResult) -> {
            System.out.println("任务C开始执行...");
            System.out.println("接收到任务A的返回值:" + firstResult);
            System.out.println("接收到任务B的返回值:" + secondResult);
            return firstResult + secondResult;
        });

        String i = futureC.get();
        System.out.println("获取到任务C的返回值:" + i);
    }
//    output：
//    任务A开始执行…
//    任务A执行完毕…
//    任务B开始执行…
//    任务B执行完毕…
//    任务C开始执行…
//    接收到任务A的返回值:A
//    接收到任务B的返回值:B
//    获取到任务C的返回值:AB

    private String getTime() {
        Date date = new Date();
        long time = date.getTime();
        return String.valueOf(time);
    }
}
